package es.tikitaka.domain;

import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import es.tikitaka.dictionary.HorasDic;
import es.tikitaka.domain.colegiado.SegColegiado;
import es.tikitaka.domain.equipo.SegEquipo;
import es.tikitaka.domain.jugador.SegJugador;
import es.tikitaka.domain.usuarios.Comite;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Entity
@Table(name = "PARTIDO")
public class Partido {

	private Integer id;
	private HorasDic hora;
	private Comite comite;
	private Set<SegEquipo> m_equipos;
	private Set<Gol> m_goles;
	private Set<Amonestacion> m_amonestaciones;
	private Set<Penalty> m_penaltys;
	private SegColegiado colegiado;
	private SegJugador mvp;
	private String local;
	private String visitante;
	private int golesL;
	private int golesV;
	private int amarillasL;
	private int amarillasV;
	private int rojasL;
	private int rojasV;
	private int faltasL;
	private int faltasV;
	private int penaltysL;
	private int penaltysV;
	private boolean fin;
	private String estado;

	/**
	 * Constructor por defecto
	 */
	public Partido() {
		this.estado = "sin comenzar";
	}

	/*
	 * getters and setters
	 */

	/**
	 * 
	 * @return id Id del partido
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PAR_GEN")
	@SequenceGenerator(allocationSize = 1, name = "PAR_GEN", sequenceName = "PAR_SEQ")
	@Column(name = "X_PAR", nullable = false, precision = 10, scale = 0)
	public Integer getId() {
		return id;
	}

	/**
	 * 
	 * @param id
	 */
	public void setId(Integer id) {
		this.id = id;
	}

	/**
	 * 
	 * @return hora HorasDic hora a la que se juega el partido
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "HORA")
	public HorasDic getHora() {
		return hora;
	}

	/**
	 * 
	 * @param hora
	 */
	public void setHora(HorasDic hora) {
		this.hora = hora;
	}

	/**
	 * 
	 * @return comite Comite que gestiona el partido
	 */
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "COMITE")
	public Comite getComite() {
		return comite;
	}

	/**
	 * 
	 * @param comite
	 */
	public void setComite(Comite comite) {
		this.comite = comite;
	}

	/**
	 * 
	 * @return equipos SegEqupipo Equipos participantes en el partido
	 */
	@OneToMany(mappedBy = "partido", fetch = FetchType.LAZY)
	public Set<SegEquipo> getM_equipos() {
		return m_equipos;
	}

	/**
	 * 
	 * @param equipos
	 */
	public void setM_equipos(Set<SegEquipo> m_equipos) {
		this.m_equipos = m_equipos;
	}

	/**
	 * 
	 * @return goles Conjunto de goles en el partido
	 */
	@OneToMany(mappedBy = "partido", fetch = FetchType.LAZY)
	public Set<Gol> getM_goles() {
		return m_goles;
	}

	/**
	 * 
	 * @param goles
	 */
	public void setM_goles(Set<Gol> m_goles) {
		this.m_goles = m_goles;
	}

	/**
	 * 
	 * @return m_amonestaciones Conjunto de amonestaciones en el partido
	 */
	@OneToMany(mappedBy = "partido", fetch = FetchType.LAZY)
	public Set<Amonestacion> getM_amonestaciones() {
		return m_amonestaciones;
	}

	/**
	 * 
	 * @param m_amonestaciones
	 */
	public void setM_amonestaciones(Set<Amonestacion> m_amonestaciones) {
		this.m_amonestaciones = m_amonestaciones;
	}

	/**
	 * 
	 * @return
	 */
	@OneToMany(mappedBy = "partido", fetch = FetchType.LAZY)
	public Set<Penalty> getM_penaltys() {
		return m_penaltys;
	}

	/**
	 * 
	 * @param m_penaltys
	 */
	public void setM_penaltys(Set<Penalty> m_penaltys) {
		this.m_penaltys = m_penaltys;
	}

	/**
	 * 
	 * @return colegiado Seguimiento de colegiado encargado de pitar el partido
	 */
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "COLEGIADO")
	public SegColegiado getColegiado() {
		return colegiado;
	}

	/**
	 * 
	 * @param colegiado
	 */
	public void setColegiado(SegColegiado colegiado) {
		this.colegiado = colegiado;
	}

	/**
	 * 
	 * @return mvp Jugador más valioso del partido
	 */
	@OneToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "MVP")
	public SegJugador getMvp() {
		return mvp;
	}

	/**
	 * 
	 * @param mvp
	 */
	public void setMvp(SegJugador mvp) {
		this.mvp = mvp;
	}

	/**
	 * 
	 * @return local Nombre del equipo local
	 */
	@Column(name = "LOCAL")
	public String getLocal() {
		return local;
	}

	/**
	 * 
	 * @param local
	 */
	public void setLocal(String local) {
		this.local = local;
	}

	/**
	 * 
	 * @return visitante Nombre del equipo visitante
	 */
	@Column(name = "VISITANTE")
	public String getVisitante() {
		return visitante;
	}

	/**
	 * 
	 * @param visitante
	 */
	public void setVisitante(String visitante) {
		this.visitante = visitante;
	}

	/**
	 * 
	 * @return golesL Total de goles del equipo local
	 */
	@Column(name = "GOLESL")
	public int getGolesL() {
		return golesL;
	}

	/**
	 * 
	 * @param golesL
	 */
	public void setGolesL(int golesL) {
		this.golesL = golesL;
	}

	/**
	 * 
	 * @return golesV Total de goles del equipo visitante
	 */
	@Column(name = "GOLESV")
	public int getGolesV() {
		return golesV;
	}

	/**
	 * 
	 * @param golesV
	 */
	public void setGolesV(int golesV) {
		this.golesV = golesV;
	}

	/**
	 * 
	 * @return amarillasL Total de tarjetas amarillas del equipo local
	 */
	@Column(name = "AMARILLASL")
	public int getAmarillasL() {
		return amarillasL;
	}

	/**
	 * 
	 * @param amarillasL
	 */
	public void setAmarillasL(int amarillasL) {
		this.amarillasL = amarillasL;
	}

	/**
	 * 
	 * @return amarillasV Total de tarjetas amarillas del equipo visitante
	 */
	@Column(name = "AMARILLASV")
	public int getAmarillasV() {
		return amarillasV;
	}

	/**
	 * 
	 * @param amarillasV
	 */
	public void setAmarillasV(int amarillasV) {
		this.amarillasV = amarillasV;
	}

	/**
	 * 
	 * @return rojasL Total de tarjetas rojas del equipo local
	 */
	@Column(name = "ROJASL")
	public int getRojasL() {
		return rojasL;
	}

	/**
	 * 
	 * @param rojasL
	 */
	public void setRojasL(int rojasL) {
		this.rojasL = rojasL;
	}

	/**
	 * 
	 * @return rojasV Total de tarjetas rojas del equipo visitante
	 */
	@Column(name = "ROJASV")
	public int getRojasV() {
		return rojasV;
	}

	/**
	 * 
	 * @param rojasV
	 */
	public void setRojasV(int rojasV) {
		this.rojasV = rojasV;
	}

	/**
	 * 
	 * @return faltasL Total de faltas del equipo Local
	 */
	@Column(name = "FALTASL")
	public int getFaltasL() {
		return faltasL;
	}

	/**
	 * 
	 * @param faltasL
	 */
	public void setFaltasL(int faltasL) {
		this.faltasL = faltasL;
	}

	/**
	 * 
	 * @return faltasV Total de faltas del equipo visitante
	 */
	@Column(name = "FALTASV")
	public int getFaltasV() {
		return faltasV;
	}

	/**
	 * 
	 * @param faltasV
	 */
	public void setFaltasV(int faltasV) {
		this.faltasV = faltasV;
	}

	/**
	 * 
	 * @return penaltysL Total de penaltys del equipo local
	 */
	@Column(name = "PENALTIESL")
	public int getPenaltysL() {
		return penaltysL;
	}

	/**
	 * 
	 * @param penaltysL
	 */
	public void setPenaltysL(int penaltysL) {
		this.penaltysL = penaltysL;
	}

	/**
	 * 
	 * @return penaltiesV Total de penaltys del equipo visitante
	 */
	@Column(name = "PENALTIESV")
	public int getPenaltysV() {
		return penaltysV;
	}

	/**
	 * 
	 * @param penaltiesV
	 */
	public void setPenaltysV(int penaltysV) {
		this.penaltysV = penaltysV;
	}

	/**
	 * 
	 * @return fin True o false si el partido ha finalizado o no respectivamente
	 */
	@Column(name = "FINALIZADO")
	public boolean isFin() {
		return fin;
	}

	/**
	 * 
	 * @param fin
	 */
	public void setFin(boolean fin) {
		this.fin = fin;
	}

	/**
	 * 
	 * @return
	 */
	@Column(name = "ESTADO")
	public String getEstado() {
		return estado;
	}

	/**
	 * 
	 * @param estado
	 */
	public void setEstado(String estado) {
		this.estado = estado;
	}

	/**
	 * Método equals
	 */
	@Override
	public boolean equals(Object obj) {
		if (!(obj instanceof Partido)) {
			return false;
		}
		if (obj != null) {
			if (this.id == ((Partido) obj).getId()) {
				return true;
			}
		}
		return false;
	}

	/**
	 * Método hashCode
	 */
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
		return super.hashCode();
	}

}
